package com.example.my_music_palyer.controller;

import com.example.my_music_palyer.model.ImageAndName;
import com.example.my_music_palyer.model.User;
import com.example.my_music_palyer.service.ImageService;
import com.example.my_music_palyer.common.tools.ImageTools;
import com.example.my_music_palyer.common.tools.ResponseBodyMessage;
import com.example.my_music_palyer.common.tools.Constant;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@RestController
@RequestMapping("/image")
public class ImageController {

    @Value("${image.pre}")
    String pre;
    
    @Autowired
    ImageTools imageTools;

    @Autowired
    ImageService imageService;

    @RequestMapping("/upload")
    ResponseBodyMessage<Integer> upload(@RequestParam("file") MultipartFile file, HttpServletResponse resp
                                        , HttpServletRequest req) throws IOException {
        try {
            System.out.println("开始上传图片，文件名: " + file.getOriginalFilename());
            
            // 检查session
            HttpSession session = req.getSession(false);
            if (session == null) {
                System.out.println("上传失败，用户未登录");
                return new ResponseBodyMessage<>(-1, "上传失败，用户未登录", 0);
            }

            // 通过session获取用户信息
            User user = (User) session.getAttribute(Constant.USERINFO_SESSION_KEY);
            if (user == null) {
                // 尝试从另一个session key获取
                user = (User) session.getAttribute("user");
            }
            
            if (user == null || user.getId() <= 0) {
                System.out.println("上传失败，用户不存在或ID无效，用户: " + user);
                return new ResponseBodyMessage<>(-1, "上传失败，用户不存在", 0);
            }

            System.out.println("用户信息: ID=" + user.getId() + ", 用户名=" + user.getUsername());

            // 检查文件
            if (file == null || file.isEmpty()) {
                System.out.println("上传失败，文件为空");
                return new ResponseBodyMessage<>(-1, "上传失败，文件为空", 0);
            }

            // 用户存在，本地上传图像
            int result = imageTools.upload(file, user.getId());
            System.out.println("本地文件上传结果: " + result);

            if (result == 1) {//本地上传成功
                String fileName = file.getOriginalFilename();//获取文件名
                System.out.println("本地文件上传成功，文件名: " + fileName);

                try {
                    // 数据库上传
                    // 1.将原来使用的图片flg设置为0
                    // A.获取用户当前使用的图片URL
                    String preUrl = imageService.getUseImageUrl(user);
                    System.out.println("当前使用的图片URL: " + preUrl);
                    
                    if (preUrl != null && !preUrl.isEmpty()) {
                        // B.将当前使用的图片flg设置为0
                        imageService.updateImage(user, 0, preUrl);
                        System.out.println("已更新原图片状态为未使用");
                    }

                    // 2.数据库中存储图片
                    int ret = imageService.uploadImage(fileName, user);
                    System.out.println("数据库存储结果: " + ret);

                    // 3.判断数据库是否存储成功
                    if (ret != 1) {
                        // 数据库存储失败
                        System.out.println("数据库存储失败，开始回滚");
                        
                        // 还原当前使用图片
                        if (preUrl != null && !preUrl.isEmpty()) {
                            imageService.updateImage(user, 1, preUrl);
                        }
                        
                        // 同时删除本地存储文件
                        int localret = imageTools.delete(fileName);
                        if (localret == 1) {
                            System.out.println("本地文件删除成功");
                        } else {
                            System.out.println("本地文件删除失败");
                        }
                        return new ResponseBodyMessage<>(-1, "上传失败，联系管理员", 0);
                    }

                    System.out.println("图片上传成功，重定向到列表页面");
                    resp.sendRedirect("/list.html");
                    return new ResponseBodyMessage<>(0, "上传成功", 1);

                } catch (Exception e) {
                    System.out.println("数据库操作过程中发生错误: " + e.getMessage());
                    e.printStackTrace();
                    // 删除本地文件
                    imageTools.delete(fileName);
                    return new ResponseBodyMessage<>(-1, "上传失败，数据库错误: " + e.getMessage(), 0);
                }
            }
            
            System.out.println("本地文件上传失败");
            return new ResponseBodyMessage<>(-1, "上传失败，联系管理员", 0);
            
        } catch (Exception e) {
            System.out.println("图片上传过程中发生未预期的错误: " + e.getMessage());
            e.printStackTrace();
            return new ResponseBodyMessage<>(-1, "上传失败，系统错误: " + e.getMessage(), 0);
        }
    }

    @RequestMapping("/getImage")
    ImageAndName getImage(HttpServletRequest req) {
        try {
            HttpSession session = req.getSession(false);
            if (session == null) {
                System.out.println("获取图片失败，用户未登录");
                return null;
            }

            // 通过session获取用户信息
            User user = (User) session.getAttribute(Constant.USERINFO_SESSION_KEY);
            if (user == null) {
                // 尝试从另一个session key获取
                user = (User) session.getAttribute("user");
            }
            
            if (user == null) {
                System.out.println("获取图片失败，用户不存在");
                return null;
            }

            String ret = imageService.getUseImageUrl(user);
            ImageAndName imageAndName = new ImageAndName();
            imageAndName.setUrl(ret != null ? ret : "1.jpg"); // 设置默认图片
            imageAndName.setUsername(user.getUsername());
            imageAndName.setPreurl(pre);
            
            System.out.println("获取图片成功，用户: " + user.getUsername() + ", 图片: " + ret);
            return imageAndName;
            
        } catch (Exception e) {
            System.out.println("获取图片过程中发生错误: " + e.getMessage());
            e.printStackTrace();
            return null;
        }
    }
}
